<?php
/**
 * Classe que usa o padrão Data Access Object para criar, ler, atualizar e deletar no banco de dados objetos do tipo Atividade
 * @name AtividadeDAO
 * @author Fabio Cezar Baía baiacfabio@gmail.com
 * @since 26/04/2013 20:40:02
 */
class AtividadeDAO extends DAO{
		
		
	/**
	 * Persiste um novo Atividade no banco de dados ou atualiza caso ja exista
	 * @access public
     * @name save
	 * @param Atividade $atividade
	 * @since 26/04/2013 20:40:10
	 */
	public function save( Atividade $atividade ) {		
		
		if($atividade->getId() == ""){			
			$this->insert($atividade);		
		}else{
			$this->update($atividade);		
		}
		
		return $this->lastId;
				
	}
	
	/**
	* Insere um novo Atividade no banco de dados
	* @access private
	* @name insert
	* @param Atividade $atividade
	* @since 26/04/2013 20:40:22
	* @return int Id do atividade inserido
	*/
	private function insert(Atividade $atividade) {
		$this->db->beginTransaction();
		try{	
			$stmt = $this->db->prepare("INSERT INTO `{$this->entity}` (nome, descricao, valor, inicio, cargaHoraria, dataModificacao, modalidade_id, palestrante_id, limiteVagas, evento_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
			$stmt->bindValue(1, $atividade->getNome() );
			$stmt->bindValue(2, $atividade->getDescricao() );
			$stmt->bindValue(3, $atividade->getValor() );
			$stmt->bindValue(4, $atividade->getInicio() );
			$stmt->bindValue(5, $atividade->getCargaHoraria() );
			$stmt->bindValue(6, $atividade->getDataModificacao()->format("Y-m-d H:i:s") );
			$stmt->bindValue(7, $atividade->getModalidade()->getId() );
			$stmt->bindValue(8, $atividade->getPalestrante()->getId() );
			$stmt->bindValue(9, $atividade->getLimiteVagas() );
			$stmt->bindValue(10, $atividade->getEvento()->getId() );
			
			$stmt->execute();
			
			$this->lastId = $this->db->lastInsertId();
			
			$this->db->commit();
			
			
			
			SystemMessage::createMessage("Atividade cadastrado com sucesso! O novo atividade receberá os dados de acesso no email cadastrado.", SystemMessage::TYPE_SUCCESS);
			
			// fecho a conexão
			$this->db = null;
			// caso ocorra um erro, retorna o erro;
		}catch ( PDOException $ex ){
			
			$this->db->rollBack();
			
			SystemMessage::createMessage("Um erro ocorreu! Não foi possível concluir a operação.", SystemMessage::TYPE_ERROR, $ex->getMessage());
		}
		
		return $this->lastId;
	}
	
	/**
	* Atualiza um Atividade no banco de dados
	* @access private
	* @name update
	* @param Atividade $atividade
	* @since 23/04/2013 22:46:59
	*/
	private function update(Atividade $atividade) {

		try{
			$stmt = $this->db->prepare("UPDATE `{$this->entity}` set nome = ?, descricao = ?, valor = ?, inicio = ?, cargaHoraria = ?,  dataModificacao = ?, modalidade_id = ?, palestrante_id = ?, evento_id = ?, limiteVagas = ? WHERE id = ?");
			$stmt->bindValue(1, $atividade->getNome() );
			$stmt->bindValue(2, $atividade->getDescricao() );
			$stmt->bindValue(3, $atividade->getValor() );
			$stmt->bindValue(4, $atividade->getInicio() );
			$stmt->bindValue(5, $atividade->getCargaHoraria() );
			$stmt->bindValue(6, $atividade->getDataModificacao()->format("Y-m-d H:i:s") );
			$stmt->bindValue(7, $atividade->getModalidade()->getId() );
			$stmt->bindValue(8, $atividade->getPalestrante()->getId() );
			$stmt->bindValue(9, $atividade->getEvento()->getId() );
			$stmt->bindValue(10, $atividade->getLimiteVagas() );
			$stmt->bindValue(11, $atividade->getId() );
				
			SystemMessage::createMessage("Atividade atualizado com sucesso!", SystemMessage::TYPE_SUCCESS);
			
			$stmt->execute();
			// fecho a conexão
			$this->db = null;			
			
			// caso ocorra um erro, retorna o erro;
		}catch ( PDOException $ex ){
			SystemMessage::createMessage("Um erro ocorreu! Não foi possível concluir a operação.", SystemMessage::TYPE_ERROR, $ex->getMessage());
		}		
		
	}
	
	/**
	* Obtem um Atividade do banco com base no id
	* @access public
	* @name get
	* @param int $id Id do Atividade a ser obtido
	* @since 29/04/2013 03:10:27
	* @return Atividade
	*/
	public function get($id) {
		$atividade = new Atividade();
		
		try{
			$stmt = $this->db->prepare("SELECT * FROM `{$this->entity}` WHERE id = ?");
			$stmt->bindValue(1, $id, PDO::PARAM_INT);
			$stmt->execute();
			
			$obj = $stmt->fetchObject();
			$atividade->setId($obj->id);
			$atividade->setNome($obj->nome);
			$atividade->setDescricao($obj->descricao);
			$atividade->setValor($obj->valor);
			$atividade->setInicio($obj->inicio);
			$atividade->setCargaHoraria($obj->cargaHoraria);
			$atividade->setDataModificacao($obj->dataModificacao);
			$atividade->setLimiteVagas($obj->limiteVagas);
			
			$modalidadeDAO = new ModalidadeDAO();
			$modalidade = $modalidadeDAO->get($obj->modalidade_id);
			$atividade->setModalidade($modalidade);
			
			$palestranteDAO = new PalestranteDAO();
			$palestrante = $palestranteDAO->get($obj->palestrante_id);
			$atividade->setPalestrante($palestrante);			
			
			$eventoDAO = new EventoDAO();
			$evento = $eventoDAO->get($obj->evento_id);
			$atividade->setEvento($evento);
			
			// fecho a conexão
			$this->db = null;
			// caso ocorra um erro, retorna o erro;
		}catch ( PDOException $ex ){
			echo "Erro: ".$ex->getMessage();
		}
		return $atividade;
	}
	
	/**
	* Lista todos os Atividades do banco
	* @access public
	* @name listAll
	* @since 24/04/2013 01:13:22
	* @return array Array de Atividades
	*/
	public function listAll() {
		$lista = array();
		
		try{
			$stmt = $this->db->prepare("SELECT * FROM `{$this->entity}`");
			$stmt->execute();
			
			while ($obj = $stmt->fetch(PDO::FETCH_OBJ, PDO::FETCH_ORI_NEXT)) {
				$atividade = new Atividade();
				
				$obj = $stmt->fetchObject();
				$atividade->setId($obj->id);
				$atividade->setNome($obj->nome);
				$atividade->setDescricao($obj->descricao);
				$atividade->setValor($obj->valor);
				$atividade->setInicio($obj->inicio);
				$atividade->setCargaHoraria($obj->cargaHoraria);
				$atividade->setDataModificacao($obj->dataModificacao);
				$atividade->setLimiteVagas($obj->limiteVagas);
				
				$modalidadeDAO = new ModalidadeDAO();
				$modalidade = $modalidadeDAO->get($obj->modalidade_id);
				$atividade->setModalidade($modalidade);
				
				$palestranteDAO = new PalestranteDAO();
				$palestrante = $palestranteDAO->get($obj->palestrante_id);
				$atividade->setPalestrante($palestrante);			
				
				$eventoDAO = new EventoDAO();
				$evento = $eventoDAO->get($obj->evento_id);
				$evento->setEvento($evento);
				
				$lista[] = $atividade;
			}			
			
			// fecho a conexão
			$this->db = null;
			// caso ocorra um erro, retorna o erro;
		}catch ( PDOException $ex ){
			echo "Erro: ".$ex->getMessage();
		}
		
		return $lista;
	}
	
	
	/**
	* Remove um Atividade do banco com base no id
	* @access public
	* @name delete
	* @param int $id Id do Atividade a ser deletado
	* @since 24/04/2013 02:30:04
	*/
	public function delete($id) {
		try{
			$stmt = $this->db->prepare("DELETE FROM `{$this->entity}` WHERE id = ?");
			$stmt->bindValue(1, $id, PDO::PARAM_INT);
			$stmt->execute();
			
			SystemMessage::createMessage("Atividade removida com sucesso!", SystemMessage::TYPE_SUCCESS);
			
			// fecho a conexão
			$this->db = null;
			// caso ocorra um erro, retorna o erro;
		}catch ( PDOException $ex ){
			SystemMessage::createMessage("Um erro ocorreu! Não foi possível concluir a operação.", SystemMessage::TYPE_ERROR, $ex->getMessage());
		}
				
	}

}


